Amazon EC2でDocker Machine + Docker Swarmを使う
はじめに
前回、Docker MachineでAmazon EC2をコントロールしてみました。今回は更にDocker Swarmを組み合わせて、Amazon EC2上にDockerクラスタを構成してみたいと思います。
やってみた
前回同様、Amazon EC2で構築したAmazon Linux上で実行しています。
クラスタを作成する
クラスタを作成し、クラスタグループを構成するためのクラスタIDを発行します。
$ sudo docker run swarm create 934afbacc9e635c52e8b6544a2eba998
マスターノードとなるDocker Machineを作成する
クラスタの管理を行うマスターノードとなるDocker Machineを作成します。前回と違うのは--swarmオプション以降で、マスターノードとなるために--swarm-masterオプションを付与しています。また--swarm-discoveryで上述のクラスタIDをトークンとして指定します。
$ sudo ./docker-machine create --driver amazonec2 --amazonec2-access-key YOUR_ACCESS_KEY --amazonec2-secret-key YOUR_SECRET_KEY --amazonec2-region ap-northeast-1 --amazonec2-ami ami-a1bf56a1 --amazonec2-vpc-id YOUR_VPC_ID --swarm --swarm-master --swarm-discovery token://934afbacc9e635c52e8b6544a2eba998 swarm-master INFO[0000] Launching instance... INFO[0024] Waiting for SSH on 54.178.186.113:22 INFO[0088] Configuring Machine... INFO[0218] Configuring Swarm... INFO[0222] "swarm-master" has been created and is now the active machine. INFO[0222] To point your Docker client at it, run this in your shell: $(docker-machine env swarm-master)
クラスタノードとなるDocker Machineを作成する
クラスタノードとなるDocker Machineでは--swarm-masterオプションを付与しません。
$ sudo ./docker-machine create --driver amazonec2 --amazonec2-access-key YOUR_ACCESS_KEY --amazonec2-secret-key YOUR_SECRET_KEY --amazonec2-region ap-northeast-1 --amazonec2-ami ami-a1bf56a1 --amazonec2-vpc-id YOUR_VPC_ID --swarm --swarm-discovery token://934afbacc9e635c52e8b6544a2eba998 swarm-node1 INFO[0000] Launching instance... INFO[0021] Waiting for SSH on 54.64.236.91:22 INFO[0085] Configuring Machine... INFO[0222] Configuring Swarm... INFO[0225] "swarm-node1" has been created and is now the active machine. INFO[0225] To point your Docker client at it, run this in your shell: $(docker-machine env swarm-node1)
今回はもう1つ、合計2つのクラスタノードを作成します。
$ sudo ./docker-machine create --driver amazonec2 --amazonec2-access-key YOUR_ACCESS_KEY --amazonec2-secret-key YOUR_SECRET_KEY --amazonec2-region ap-northeast-1 --amazonec2-ami ami-a1bf56a1 --amazonec2-vpc-id YOUR_VPC_ID --swarm --swarm-discovery token://934afbacc9e635c52e8b6544a2eba998 swarm-node2 INFO[0000] Launching instance... INFO[0024] Waiting for SSH on 54.92.100.248:22 INFO[0087] Configuring Machine... INFO[0223] Configuring Swarm... INFO[0227] "swarm-node2" has been created and is now the active machine. INFO[0227] To point your Docker client at it, run this in your shell: $(docker-machine env swarm-node2)
以下のように3つのEC2インスタンスが起動します。
クラスタ情報を確認する
以下のようにdocker-machine lsを実行すると、SWARM項目にマスターノード名が入った形で表示されます。
$ sudo ./docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM swarm-master amazonec2 Running tcp://54.178.186.113:2376 swarm-master (master) swarm-node1 amazonec2 Running tcp://54.64.236.91:2376 swarm-master swarm-node2 * amazonec2 Running tcp://54.92.100.248:2376 swarm-master
マスターノードに対して操作を行うので、マスターノード用の環境変数をセットします。
$ $(sudo ./docker-machine env --swarm swarm-master)
マスターノードに対してdocker infoを実行すると、以下のようにクラスタを構成する各ノードの情報が取得できます。
$ sudo -E docker info Containers: 4 Nodes: 3 swarm-master: 54.178.186.113:2376 └ Containers: 2 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 992.5 MiB swarm-node1: 54.64.236.91:2376 └ Containers: 1 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 992.5 MiB swarm-node2: 54.92.100.248:2376 └ Containers: 1 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 992.5 Mi
クラスタにコンテナを起動する
マスターノードに対しdocker runでコンテナを起動します。
$ sudo -E docker run -d memcached
すると以下のように、swarm-node1でmemcachedコンテナが起動します。
$ sudo -E docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9254f7e5d6da memcached:1 "memcached" 32 seconds ago Up 3 seconds 11211/tcp swarm-node1/goofy_perlman
更にもう一度、コンテナを起動します。
$ sudo -E docker run -d memcached d4c85ea5113e1809c479af10935c01d6944199bd93d1633329d3d9b91605ae89
すると、次はswarm-node2のほうでmemcachedコンテナが起動しました!
$ sudo -E docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d4c85ea5113e memcached:1 "memcached" 4 seconds ago Up Less than a second 11211/tcp swarm-node2/modest_brattain 9254f7e5d6da memcached:1 "memcached" About a minute ago Up About a minute 11211/tcp swarm-node1/goofy_perlman
ということで、ちゃんと分散されたDocker Machineの上で、Dockerコンテナがクラスタとして起動します!
さいごに
Elasticsearchのような分散アプリケーションをコンテナとしてボンボン立ち上げられるので、リソース追加が簡単にできそうです。
次はDocker Composeを試してみたいと思います!